/*
 * Copyright 2007 by LongTop Corporation.
 * Softpack ChuangXin Building 15F, XiaMen, FuJian, PRC 361005
 *
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * LongTop Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with LongTop.
 *
 */
package com.longtop.framework.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.longtop.framework.common.Constant;
import com.longtop.framework.common.Message;
import com.longtop.framework.common.QueryConditions;
import com.longtop.framework.common.ResourceConstants;
import com.longtop.intelliweb.action.AbstractBaseAction;
import com.longtop.intelliweb.util.UtilTransform;
import com.longtop.intelliweb.view.Dataset;
import com.longtop.intelliweb.view.Record;

/**
 * Web层管理工具类（Action中调用）。<br>
 * <p/> 用于提供Action中公共调用
 * 
 * @author IntelliWeb Team
 * @version 2.0
 */
public class WebUtil {
	private static Logger log = Logger.getLogger(WebUtil.class);

	/**
	 * 把dataset里的记录根据状态分别转成要删除的主键列表、新增对象列表，更新对象列表。<br>
	 * 其中新增对象列表及更新对象列表中成员对象为参数clazz的实例
	 * 
	 * @param dataset
	 *            Web层的数据集对象
	 * @param keyField
	 *            要删除实体对象的主键字段名
	 * @param clazz
	 *            要转成的实体对象对应的类，clazz实例化的对象是一个普通javabean,其成员是简单类型，不含list,map或nested
	 * @param excludeFields
	 *            排除哪些字段不转到VO中
	 * @return 对象列表，有四个值，第一个存储删除主键列表，第二个存储更新bean的列表，第三个存储新增bean的列表，第四个存储删除bean的列表
	 * @throws Exception
	 *             转换失败
	 */
	public static Map datasetToObjectList(Dataset dataset, String keyField, Class clazz, String excludeFields) throws Exception {
		if (dataset == null || dataset.size() == 0)
			return null;
		log.debug("datasetToObjectList.................................");
		// Dataset的记录对象
		Record record = null;
		// 删除的id列表
		StringBuffer idList = new StringBuffer();
		// dataset中新增记录转成bean的列表
		List insertBeanList = new ArrayList();
		// dataset中修改记录转成bean的列表
		List updateBeanList = new ArrayList();
		// dataset中删除记录转成bean的列表
		List deleteBeanList = new ArrayList();
		// 实体对象
		Object bean = null;
		// 返回的对象列表
		Map objectList = new HashMap();

		dataset.moveBeforeFirst();
		while (dataset.hasNext()) {
			record = dataset.moveNext();

			if (record.getState() == Record.STATE_DELETE) {// 删除过的记录
				StringUtil.populate(idList, record.getString(keyField), dataset.hasNext());
				// 从clazz创建一个实例
				bean = clazz.newInstance();
				// 转换Record对象成Bean对象
				UtilTransform.recordToVO(record, bean, excludeFields);
				// 追加到updateBeanList
				deleteBeanList.add(bean);
			} else if (record.getState() == Record.STATE_INSERT) {// 新增的记录
				// 从clazz创建一个实例
				bean = clazz.newInstance();
				// 转换Record对象成Bean对象
				UtilTransform.recordToVO(record, bean, excludeFields);
				// 追加到updateBeanList
				insertBeanList.add(bean);
			} else if (record.getState() == Record.STATE_UPDATE) { // 修改过的记录
				// 从clazz创建一个实例
				bean = clazz.newInstance();
				// 转换Record对象成Bean对象
				UtilTransform.recordToVO(record, bean, excludeFields);
				// 追加到insertBeanList
				updateBeanList.add(bean);
			}
		}
		objectList.put(Constant.ID_LIST, StringUtil.afterOfDeletion(idList.toString(), ","));
		objectList.put(Constant.INSERT_BEAN_LIST, insertBeanList);
		objectList.put(Constant.UPDATE_BEAN_LIST, updateBeanList);
		objectList.put(Constant.DELETE_BEAN_LIST, deleteBeanList);
		return objectList;
	}

	public static Map datasetToObjectList(Dataset dataset, String keyField, Class clazz) throws Exception {
		return datasetToObjectList(dataset, keyField, clazz, null);
	}

	/**
	 * 把dataset里的记录根据状态分别转成要存储新增对象列表，更新对象列表,删除bean列表。<br>
	 * 其中新增对象列表及更新对象列表中成员对象为Map，Map中的key为dataset的fieldName
	 * 
	 * @param dataset
	 *            Web层的数据集对象
	 * @return 对象列表，有三个值，第一个存储新增bean的列表，第二个存储更新bean的列表，第三个存储删除bean列表
	 * @throws Exception
	 *             转换失败
	 */
	public static Map datasetToObjectList(Dataset dataset) throws Exception {
		if (dataset == null || dataset.size() == 0)
			return null;

		// Dataset的记录对象
		Record record = null;
		// dataset中新增记录转成bean的列表
		List insertBeanList = new ArrayList();
		// dataset中修改记录转成bean的列表
		List updateBeanList = new ArrayList();
		// dataset中删除记录转成bean的列表
		List deleteBeanList = new ArrayList();
		// 返回的对象列表
		Map objectList = new HashMap();
		Map map = null;

		dataset.moveBeforeFirst();
		while (dataset.hasNext()) {
			map = new HashMap();
			record = dataset.moveNext();
			if (record.getState() == Record.STATE_INSERT) { // 新增的记录
				insertBeanList.add(UtilTransform.recordToMap(record, map));
			} else if (record.getState() == Record.STATE_UPDATE) { // 修改过的记录
				updateBeanList.add(UtilTransform.recordToMap(record, map));
			} else if (record.getState() == Record.STATE_DELETE) { // 删除过的记录
				deleteBeanList.add(UtilTransform.recordToMap(record, map));
			}
		}

		objectList.put(Constant.INSERT_BEAN_LIST, insertBeanList);
		objectList.put(Constant.UPDATE_BEAN_LIST, updateBeanList);
		objectList.put(Constant.DELETE_BEAN_LIST, deleteBeanList);

		return objectList;
	}

	/**
	 * 验证数据集对象是否存在 <p/> 一般用于使用该数据集前进行校验
	 * 
	 * @param dataset
	 *            CustomDataset
	 * @param action
	 *            Action
	 * @param datasetId
	 *            数据集的id
	 * @return boolean:true，存在，false:不存在
	 */
	public static boolean validateDatasetExist(AbstractBaseAction action, Dataset dataset, String datasetId) {
		if (dataset == null) {
			action.hintErrorMessage(Message.getMessage(ResourceConstants.E_COMM_0005, new Object[] { datasetId }));
			action.hintMessageOnSuccess(true);
			return false;
		}
		return true;
	}

	/**
	 * 验证数据集是否存在及是否有变化 <p/> 一般用于保存数据到数据库前进行校验。
	 * 
	 * @param dataset
	 *            CustomDataset
	 * @param action
	 *            Action
	 * @param datasetId
	 *            数据集的id
	 * @return boolean:true，存在，false:不存在
	 */
	public static boolean validateDatasetChange(AbstractBaseAction action, Dataset dataset, String datasetId) {
		if (dataset == null) {
			action.hintErrorMessage(Message.getMessage(ResourceConstants.E_COMM_0005, new Object[] { datasetId }));
			return false;
		}

		if (dataset.size() == 0) {
			action.hintErrorMessage(Message.getMessage(ResourceConstants.I_COMM_0006));
			return false;
		}

		return true;
	}

	/**
	 * 获取操作成功信息(一般用于Action更新成功调用)
	 * 
	 * @param insertCount
	 *            成功插入的记录数
	 * @param updateCount
	 *            成功更新的记录数
	 * @param deleteCount
	 *            成功删除的记录数
	 * @return string 操作成功信息
	 */
	public static String getSubmitSuccessInfo(int insertCount, int updateCount, int deleteCount) {
		String strHeader = Message.getMessage(ResourceConstants.I_COMM_0000) + "\n";
		if (insertCount > 0)
			strHeader += "\n" + Message.getMessage(ResourceConstants.I_COMM_0001, new Object[] { new Integer(insertCount) });
		if (updateCount > 0)
			strHeader += "\n" + Message.getMessage(ResourceConstants.I_COMM_0002, new Object[] { new Integer(updateCount) });
		if (deleteCount > 0)
			strHeader += "\n" + Message.getMessage(ResourceConstants.I_COMM_0003, new Object[] { new Integer(deleteCount) });
		return strHeader;
	}

	public static QueryConditions createQueryConditions() {
		return new QueryConditions();
	}
}
